import tool from "../tool/index.js";

axios.defaults.baseURL = ''

axios.defaults.timeout = 10000;

// HTTP request 拦截器
axios.interceptors.request.use((conf) => {
    return conf;
}, (error) => {
    return Promise.reject(error);
});

//FIX 多个API同时401时疯狂弹窗BUG
let MessageBox_401_show = false

// HTTP response 拦截器
axios.interceptors.response.use((response) => {
    return response;
}, (error) => {
    if (error.response) {
        if (error.response.status === 404) {
            tool.snackbarShow("正在请求不存在的服务器资源");
        } else if (error.response.status === 500) {
            tool.snackbarShow("服务器发生错误，请联系开发人员");
        } else if (error.response.status === 401) {
            if (!MessageBox_401_show) {
                MessageBox_401_show = true
                tool.snackbarShow("无权限访问");
            }
        } else {
            tool.snackbarShow("请求错误");
        }
    } else {
        tool.snackbarShow("请求服务器无响应");
    }
    return Promise.reject(error.response);
});

let http = {
    /** get 请求
     * @param  {string} url 接口地址
     * @param  {object} params 请求参数
     * @param  {object} config 参数
     */
    get: (url, params = {}, config = {}) => {
        return new Promise((resolve, reject) => {
            axios({
                method: 'get', url: url, params: params, ...config
            }).then((response) => {
                resolve(response.data);
            }).catch((error) => {
                reject(error);
            })
        })
    },

    /** post 请求
     * @param url 接口地址
     * @param data 请求参数
     * @param config 配置文件
     * @param data 请求参数
     */
    post: (url, data = {}, config = {}) => {
        return new Promise((resolve, reject) => {
            axios({
                method: 'post', url: url, data: data, ...config
            }).then((response) => {
                resolve(response.data);
            }).catch((error) => {
                reject(error);
            })
        })
    },

    /** put 请求
     * @param url 接口地址
     * @param data 请求参数
     * @param config 参数
     */
    put: (url, data = {}, config = {}) => {
        return new Promise((resolve, reject) => {
            axios({
                method: 'put', url: url, data: data, ...config
            }).then((response) => {
                resolve(response.data);
            }).catch((error) => {
                reject(error);
            })
        })
    },

    /** patch 请求
     * @param url 接口地址
     * @param data 请求参数
     * @param config 参数
     */
    patch: (url, data = {}, config = {}) => {
        return new Promise((resolve, reject) => {
            axios({
                method: 'patch', url: url, data: data, ...config
            }).then((response) => {
                resolve(response.data);
            }).catch((error) => {
                reject(error);
            })
        })
    },

    /** delete 请求
     * @param url 接口地址
     * @param data 请求参数
     * @param config 参数
     */
    delete: (url, data = {}, config = {}) => {
        return new Promise((resolve, reject) => {
            axios({
                method: 'delete', url: url, data: data, ...config
            }).then((response) => {
                resolve(response.data);
            }).catch((error) => {
                reject(error);
            })
        })
    },

    /** jsonp 请求
     * @param url 接口地址
     * @param name JSONP回调函数名称
     */
    jsonp: (url, name = 'jsonp') => {
        return new Promise((resolve) => {
            let script = document.createElement('script')
            script.id = `jsonp${Math.ceil(Math.random() * 1000000)}`
            script.type = 'text/javascript'
            script.src = url
            window[name] = (response) => {
                resolve(response)
                document.getElementsByTagName('head')[0].removeChild(script)
                try {
                    delete window[name];
                } catch (e) {
                    window[name] = undefined;
                }
            }
            document.getElementsByTagName('head')[0].appendChild(script)
        })
    }
}

export default http;
